.model small

buf EQU 64
buf1 EQU 1
buf2 EQU 2
.stack 100h
.data

 Buff1 DB Buf1 dup (0)

 Buff2 DB Buf2 dup (0)

 SFile	db buf dup (0)	

 DFile	db buf dup (0)

 ent  DB 10,13,'$'

 help  DB "Komanda: pr2.exe parametras source_file destination_file ", 10, 13, "Parametrai:", 10, 13, "e - encoding (is 2-ainio i 16-aini)", 10, 13, "d - decoding (is 16-tainio i 2-aini)", 10, 13, "$"
 iveskite DB  'Iveskite eilute:', 13, 10, '$'
 error DB "Neteisingai ivesti parametrai!!! Ziurekite helpa (/?)", 13, 10, '$'
 Oerror DB "Klaida atidarant faila. Patikrinkite, ar teisingai ivedete Source failo pavadinima!",13,10,'$'
 Oerror2 DB "Klaida sukuriant Destination faila!",13,10,'$'
 S	dw ?			;vieta, skirta saugoti duomen failo deskriptoriaus numer ("handle")
 D	dw ?			;vieta, skirta saugoti rezultato failo deskriptoriaus numer


.code
  Pradzia:
 
 MOV ax, @data
 mov ds, ax 
 MOV si, 81h
 Ieskok:
 MOV ax, es:[si]
 CMP al, 0Dh  ;tikrinam, ar tai ne pabaigos simbolis
 JE pNera CMP ax, 3F2Fh ;o gal nuskaityta "/?" - 3F = '?'; 2F = '/'
 JE pHelpas             ;radau "/?", vadinasi turiu i?vesti pagalbos prane?im?
 CMP al, 65h
 JE pEncode
 CMP al, 64h
 JE pDecode
 INC si
 JMP Ieskok  ;u?ciklinu
;-------------------------------------------------------------------------------
ReadF:
  INC si
  mov ax, es:[si]
  CMP al, 0Dh  ;tikrinam, ar tai ne pabaigos simbolis
  JE pNera
  cmp al, ' '
  jne pNera
  INC si
  lea di,SFile
  sname:
    mov ax, es:[si]
    CMP al, 0Dh  ;tikrinam, ar tai ne pabaigos simbolis
    JE pNera
    CMP al, ' '
    JE SReadEnd
    inc si
    mov [di],al
    inc di
    JMP sname
    SReadEnd:
    INC si
    lea di,DFile
  dname:
    mov ax, es:[si]
    CMP al, 0Dh  ;tikrinam, ar tai ne pabaigos simbolis
    JE FReadEnd
    inc si
    mov [di],al
    inc di
    JMP dname
  FReadEnd:
    RET

  OpenF:
  
    MOV	ah, 3Dh				;21h pertraukimo failo atidarymo funkcijos numeris
    MOV	al, 0				;00 - failas atidaromas skaitymui
    lea	dx, SFile			;vieta, kur nurodomas failo pavadinimas, pasibaigiantis nuliniu simboliu
	INT	21h				;failas atidaromas skaitymui
	JC	pOpenError	;jei atidarant fail skaitymui vyksta klaida, nustatomas carry flag
	MOV	S, ax	
        MOV	ah, 3Ch				;21h pertraukimo failo sukrimo funkcijos numeris
	MOV	cx, 0				;kuriamo failo atributai
	MOV	dx, offset DFile			;vieta, kur nurodomas failo pavadinimas, pasibaigiantis nuliniu simboliu
	INT	21h				;sukuriamas failas; jei failas jau egzistuoja, visa jo informacija itrinama
	JC	pOpenError2		;jei kuriant fail skaitymui vyksta klaida, nustatomas carry flag
	MOV	D, ax			;atmintyje isisaugom rezultato failo deskriptoriaus numer

 RET

;-----------------------------------------------------------------------------
pHelpas:
 jmp Helpas
pNera:
 jmp Nera
pEncode:
 jmp Encode
pDecode:
 jmp Decode
pOpenError:
 jmp OpenError
pOpenError2:
 jmp OpenError2 
;-----------------------------------------------------------------------------

Enc:

	MOV	ah, 3Fh			;21h pertraukimo duomen nuskaitymo funkcijos numeris
	MOV	bx, S		; bx raom duomen failo deskriptoriaus numer
	MOV	cl, 1		;cx - kiek bait reikia nuskaityti i failo
	MOV	ch, 0			;ivalom vyresnj cx bait
	MOV	dx, offset Buff1	;vieta,  kuri raoma nuskaityta informacija
	INT	21h			;skaitymas i failo
	JC	pOpenError		;jei skaitant i failo vyksta klaida, nustatomas carry flag
	CMP	ax, 0			;prieingu atveju,  ax raoma, kiek bait buvo nuskaityta
	JE	encend
  
	MOV	cx,1
	MOV	si, offset Buff1
	MOV	di, offset Buff2
	MOV	al, [si]
	MOV dl,10h
  DIV dl
  ADD al, 30h
  cmp al, 3Ah
   JE  correct1
  cmp al, 3Bh
   JE  correct1 
 cmp al, 3Ch 
  JE  correct1
  cmp al, 3Dh 
  JE  correct1
  cmp al, 3Eh
   JE  correct1
  cmp al, 3Fh 
  JE  correct1 
 JMP toliau1
  correct1: ADD al,07h
 toliau1: ADD ah, 30h
  cmp ah, 3Ah
   JE  correct
  cmp ah, 3Bh
   JE  correct
  cmp ah, 3Ch 
  JE  correct
  cmp ah, 3Dh
   JE  correct
  cmp ah, 3Eh
   JE  correct
  cmp ah, 3Fh
   JE  correct
  JMP toliau
  correct: ADD ah,07h
	toliau: MOV	[di], ax
	INC	si
	INC	di


	MOV cx,2
  MOV	ah, 40h			;21h pertraukimo duomen raymo funkcijos numeris
	MOV	bx, D		; bx raom rezultato failo deskriptoriaus numer
	MOV	dx, offset Buff2	;vieta, i kurios raom  fail
	INT	21h			;raymas  fail
	JC	ppOpenError		;jei raant  fail vyksta klaida, nustatomas carry flag	
	
  MOV cx,2
  MOV	ah, 40h			;21h pertraukimo duomen raymo funkcijos numeris
	MOV	bx, D		; bx raom rezultato failo deskriptoriaus numer
	MOV	dx,20h	;vieta, i kurios raom  fail
	INT	21h			;raymas  fail
	JC	ppOpenError		;jei raant  fail vyksta klaida, nustatomas carry flag	
 CMP	cx, buf2		;jeigu vyko darbas su pilnu buferiu -> i duomen failo buvo nuskaitytas pilnas buferis ->
	JE	pEnc		;-> reikia skaityti toliau
	encend: RET
 pEnc: JMP Enc
 ;--------------------------------------------------------------------------------
ppOpenError: JMP OpenError
pdecend: JMP decend
;---------------------------------------------------------------------------------
Deco:
  skait:
	MOV	ah, 3Fh			;21h pertraukimo duomen nuskaitymo funkcijos numeris
	MOV	bx, S		; bx raom duomen failo deskriptoriaus numer
	MOV	cl, 2		;cx - kiek bait reikia nuskaityti i failo
	MOV	ch, 0			;ivalom vyresnj cx bait
	MOV	dx, offset Buff2	;vieta,  kuri raoma nuskaityta informacija
	INT	21h			;skaitymas i failo
	JC	ppOpenError		;jei skaitant i failo vyksta klaida, nustatomas carry flag
	CMP	ax, 0			;prieingu atveju,  ax raoma, kiek bait buvo nuskaityta
	JE	pdecend
		
	MOV	si, offset Buff2
	MOV	di, offset Buff1
	MOV	ax, [si]
	
	cmp al, 41h
   JE  dcorrect1
  cmp al, 42h
   JE  dcorrect1
  cmp al, 43h
   JE  dcorrect1
  cmp al, 44h
   JE  dcorrect1
  cmp al, 45h
   JE  dcorrect1
  cmp al, 46h
   JE  dcorrect1
  JMP dtoliau1 
 dcorrect1: SUB al,07h
  dtoliau1:
  cmp ah, 41h
   JE  dcorrect
  cmp ah, 42h
   JE  dcorrect
  cmp ah, 43h 
  JE  dcorrect
  cmp ah, 44h
   JE  dcorrect
  cmp ah, 45h
  JE  dcorrect
  cmp ah, 46h 
  JE  dcorrect 
 JMP dtoliau
  dcorrect: SUB ah,07h 
 dtoliau:
	push cx	
MOV cl,4 
 SHL al,cl
  pop cx
  ADD al,ah 
 SUB al,30h 
 MOV	[di], al	
INC	si	
INC	di
		
    MOV cx,1 
    MOV	ah, 40h			;21h pertraukimo duomen raymo funkcijos numeris
    MOV	bx, D		; bx raom rezultato failo deskriptoriaus numer	
    MOV	dx, offset Buff1	;vieta, i kurios raom  fail
    INT	21h			;raymas  fail
    JC	OpenError		;jei raant  fail vyksta klaida, nustatomas carry flag	
    CMP	cx, buf1		;jeigu vyko darbas su pilnu buferiu -> i duomen failo buvo nuskaitytas pilnas buferis ->
    JE	pDeco		;-> reikia skaityti toliau
    pDeco:  	
    MOV	ah, 3Fh			;21h pertraukimo duomen nuskaitymo funkcijos numeris
	MOV	bx, S		; bx raom duomen failo deskriptoriaus numer
	MOV	cl, 2		;cx - kiek bait reikia nuskaityti i failo
	MOV	ch, 0			;ivalom vyresnj cx bait
	MOV	dx, offset Buff2	;vieta,  kuri raoma nuskaityta informacija
	INT	21h			;skaitymas i failo
	JC	OpenError		;jei skaitant i failo vyksta klaida, nustatomas carry flag
	CMP	ax, 0			;prieingu atveju,  ax raoma, kiek bait buvo nuskaityta
	JE	decend
 JMP Deco
	
	decend : RET
;----------------------------------------------------------------------

CloseF:

	MOV	ah, 3Eh			;21h pertraukimo failo udarymo funkcijos numeris
	MOV	bx, D		; bx raom rezultato failo deskriptoriaus numer
	INT	21h			;failo udarymas
	JC	OpenError	;jei udarant fail vyksta klaida, nustatomas carry flag
	
	MOV	ah, 3Eh			;21h pertraukimo failo udarymo funkcijos numeris
	MOV	bx, S		; bx raom duomen failo deskriptoriaus numer
	INT	21h			;failo udarymas
	JC	OpenError	;jei udarant fail vyksta klaida, nustatomas carry flag

  RET
;------------------------------------------------------------------------------


Encode:
 call ReadF
 call OpenF
 call Enc
 call CloseF
 jmp eof


Decode:
 call ReadF
 call OpenF
 call Deco
 call CloseF
 jmp eof

;------------------------------------------------------------------------------
Helpas:
 lea dx, help
 MOV ah, 09h  ;? ah ?ra?au dosinio pertraukimo funkcijos numer?
 INT 21h  ;i?kvie?iu dosin? pertraukim? - spausdinu prane?im?
 jmp eof

OpenError:
 lea dx, Oerror
 MOV ah, 09h
 INT 21h
 jmp eof

OpenError2:
 lea dx, Oerror2
 MOV ah, 09h 
INT 21h
 jmp eof
 
 
Nera:
;spausdinam pranesima
 lea dx, error
 MOV ah, 09h
 INT 21h
 jmp eof

eof:

     MOV ah, 4Ch
     MOV al, 0
     INT 21h
 
END

